這幾天都會針對 JavaScript 和 bootstrap 5 做一個大略的回顧,假如對這兩個語法已經十分認識的朋友們,其實就可以直接跳過前面這幾篇囉。
剛接觸程式的時候,也曾經為了命名糾結過一陣子(?),後來了解到駝峰式的命名,現在就可以輕鬆命名了,其實沒有,現在換糾結怎麼將變數命名的容易辨別,能夠使專案更易維護 XD
我們概略的知道小駝峰就是第一個單字小寫開始,第二個單字大寫開始,譬如:myDemo;大駝峰就是每一個單字都使用大寫開始,譬如:MyDome。我較習慣使用小駝峰的命名法,那我們就直接開始這一題的任務。
任務:
條件:
- 宣告變數、函式,變數請給予值
 - 變數名稱請用小駝峰的方式定義,並以非動詞作為開頭
 - 函式請用動詞作為開頭
 
變數:
1. 我的名稱: myName
2. 餐廳數量: restaurantNum
3. 課程 id: classId
4. 畢業日期: graduateDate
5. 練習時間: practiceTime
函式:
1. 取得產品資料: getProductData
2. 渲染圖表: renderChart
3. 篩選購物車資料: filterCartData
4. 排序註冊日期: sortRegisterDate
5. 刪除訂單: delete
物件取值常見的兩種方式,點記法 ( Dot notation ) 以及括弧記法 ( Bracket notation )。先簡單解釋一下這兩樣東西。
點記法 ( Dot notation )
我們可以利用點記法存取物件的屬性或函式,例如:
person.Jemma
person.item[0]
括弧記法 ( Bracket notation )
與點記法一樣是存取物件的方式,兩者可以互相配合使用,例如:
person[Jemma]
person['item']['first']
任務:
let c = ' 這是中文字';
let arr = {
  a: 'a',
  1: 'b',
  ' 這是中文字': 'c',
  'b': 'd',
  '--some data': 'e'
}
console.log();  // 請取得結果為 'b' 的值
console.log();  // 請取得結果為 'c' 的值,必須使用變數
console.log();  // 請取得結果為 'd' 的值,必須使用點記號
console.log();  // 請取得結果為 'e' 的值
console.log();  // 請取得結果為 'b' 的值
// console.log(arr[1]); 結果:b
console.log();  // 請取得結果為 'c' 的值,必須使用變數
// console.log(arr[' 這是中文字']); 結果:c
console.log();  // 請取得結果為 'd' 的值,必須使用點記號
// 這裡有兩種方法,點記法和括弧記法都可以讓結果是 'd',不果題目說要點記法
// console.log(arr['b'])、console.log(arr.b); 結果:d
console.log();  // 請取得結果為 'e' 的值
// console.log(arr['--some data']); 結果:e
使用 Object.keys() 和 Object.values() 來執行題目要求:
任務:
Object.keys )。Object.values )。forEach、使用 console.log 輸出陣列的所有屬性名稱。for 迴圈、使用 console.log 輸出陣列的所有屬性值。let c = ' 這是中文字';
let arr = {
  a: 'a',
  1: 'b',
  ' 這是中文字': 'c',
  'b': 'd',
  '--some data': 'e'
}
console.log(Object.keys(arr)); // 1
console.log(Object.values(arr)); // 2
// 3
let a = Object.keys(arr);
a.forEach(function(item) {
	console.log(item);
})
// 4
let b = Object.values(arr);
for(let i = 0; i < b.length; i++) {
	console.log(b[i]);
}
任務 ①
這題我自己是直接用 filter 方法結束這回合,而題目的解答則是用 callback 函式的方式處理,將函式作為參數調用。
以下 crowdAge 為部分民眾的年紀資料,請修改程式碼、篩選出屬性 age > 18 的陣列元素,並將它們一一加入 filterResult 這個陣列中。( 可以使用 push() 或是 filter() 函式 )
let crowdAge = [
  {
    name: 'Rick',
    age: 17
  },
  {
    name: 'Jane',
    age: 25
  },
  {
    name: 'Jordan',
    age: 19
  },
  {
    name: 'Jack',
    age: 7
  },
  {
    name: 'Reol',
    age: 27
  }
]
// callback 函式
function ageFilterCB(cb, arr) {
  return cb(arr);
}
function ageFilter(arr) {
  let target = [];
  arr.forEach(item => {
  	if(item.age > 18) {
    	target.push(item);
    }
  })
  return target;
}
let filterResult = [];
filterResult = ageFilterCB(ageFilter, crowdAge);
console.log(filterResult); /* 為陣列,內容包含屬性 age > 18 的 crowdAge 元素 */
任務 ➁
請使用 map() 操作 array 陣列,賦予 newArray 陣列元素。
const array = [
    {
      name: '小明',
      age: 18
    },
    {
      name: '小美',
      age: 15
    },
    {
      name: '小櫻',
      age: 19
    },
    {
      name: '知世',
      age: 22
    },
    {
      name: '雪兔',
      age: 28
    }
];
let newArray = array.map(function(item) {
	return `${item.name} + ${item.age} + '歲囉'`;
})
任務 2,同樣也可以用來當作 filter 的練習,這裡就不再做演示了。
任務:
小明有固定存錢的好習慣,以下是小明的銀行帳戶資訊。
mingTransfer 的內容合併到 mingAccount.depositRecord 陣列中 (使用 .push())。mingAccount.deposit 中 (可以使用 forEach() 或 reduce())// 小明的銀行帳戶資訊
let mingAccount = {
  name: '小明',
  age: 22,
  deposit: 10000,
  depositRecord: [
    {
      title: '開戶',
      amounts: 10000
    }
  ]
};
// 小明的存款資訊
let mingTransfer = [
  {
    title: '一月存款',
    amounts: 777
  },
  {
    title: '二月存款',
    amounts: 7000
  },
  {
    title: '三月存款',
    amounts: 70000
  }
]
mingTransfer.forEach(function(item) {
	mingAccount.depositRecord.push(item);
	mingAccount.deposit += item.amounts;
})
console.log(mingAccount);
// {name: '小明', age: 22, deposit: 87777, depositRecord: Array(4)}
任務:
step1. 將 town 的內容複製到 townData。
step2. 將 Ming、Rick 兩個物件加入到 townData.resident 中
let town = {
  name: '真心鎮',
  resident: []
}
let townData = {};
let Ming = { name: '小明', age: 16 };
let Rick = { name: '瑞克', age: 21 };
function addResident(obj, res1, res2) {
    townData = {...obj};
    townData.resident.push(res1);
    townData.resident.push(res2);
    console.log(townData)
}
addResident(town, Ming, Rick);
console.log(townData === town); // 結果須為 false
陳述式:陳述式通常會是一段程式碼,並且一定會做些什麼,但不會回傳值。
表達式:表達式則會回傳值。
任務 ①
以判斷式判斷下列選項,何者代入 Ans 為表達式,並且 console.log 不會報錯?
if(Ans) {
  console.log('Ans 是表達式');
}
1. 2 === 2
2. "string"
3. var a // Ⓧ Uncaught SyntaxError: Unexpected token 'var'
4. if(true){let a = 2;} // Ⓧ Uncaught SyntaxError: Unexpected token 'if'
5. [25, 30] // 純陣列
6. {name: "hexSchool"}  // 純物件
答案:1、2、5、6
任務 ②
表達式的應用:
function newData() {
  return true;
}
以上程式碼為一個「表達式」,請大家到 MDN 或是透過 Google 搜尋,尋找有哪些程式運作可以插入以上的表達式,仍能正確運行。
function newData() {
  return true;
}
let newDataGetTrue = `可以運行:${newData()}`;
console.log(newDataGetTrue);
// 可以運行:true
任務:
<input type="text" value="520" id="app">
const inputValue = document.querySelector('#app').value;
value = parseInt(inputValue);
if(value === 520) {
  console.log('暗戀對象喜歡我');
} else {
  console.log('暗戀對象只想和我當普通朋友');
}
這題要看清楚,畢竟是型別轉換練習,所以取的會是數字型別的 value。看到這題的時候,真心覺得這題錯不得阿(?
那麼今天的 JavaScript 小回顧就先告一個段落,目前依然是深夜時段了,休息是為了走更長遠的路,我們明天繼續,歐鴨司咪拿塞。